package mmc.server.shell.ops.function;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import mmc.server.shell.Shell;
import mmc.server.shell.ShellException;
import mmc.server.shell.ops.Function;

public class Dir extends Function {

	Class<?> clasz;
	
    public Dir(String text) throws ShellException {
        super(text, "dir", 1, false);
        
        clasz = arguments.getArguments().remove(0).getOutputType();
    }

    @Override
    public double execute() {
        throw new RuntimeException(this+" has no return value");
    }
    
    public Object executeComplex(){
    	Shell.out.println("Constructors:");
    	for(Constructor<?> c : clasz.getConstructors()){
    		Shell.out.print("   "+c.getName()+"(");
    		for(int i=0;i<c.getParameterTypes().length;i++){
				if(i!=0)
					Shell.out.print(", ");
				Shell.out.print(c.getParameterTypes()[i].getSimpleName());
			}
			Shell.out.println(")");
    	}
    	
    	Shell.out.println("Methods:");
    	for(Method m : clasz.getMethods()){
    		if(!clasz.getName().startsWith("mmc")||!m.getDeclaringClass().getName().startsWith("java.lang")){
    			Shell.out.print(" "+(Modifier.isStatic(m.getModifiers())?"S":" ")+" "+m.getDeclaringClass().getSimpleName()+": ");
    			
    			Shell.out.print(String.format("%-7s",m.getReturnType().getSimpleName())+" "+m.getName()+" (");
    			for(int i=0;i<m.getParameterTypes().length;i++){
    				if(i!=0)
    					Shell.out.print(", ");
    				Shell.out.print(m.getParameterTypes()[i].getSimpleName());
    			}
    			Shell.out.println(")");
    		}
    	}
		
    	Shell.out.println("Fields:");
    	for(Field f : clasz.getFields()){
    		Shell.out.println(" "+(Modifier.isStatic(f.getModifiers())?"S":" ")+" "+f.getDeclaringClass().getSimpleName()+": "+String.format("%-7s",f.getType().getSimpleName())+" "+f.getName());
    	}
    	
    	return null;
    }
    
    public Class<?> getOutputType(){
    	return void.class;
    }
    
    public static String getDescription(){
    	return formatHelpString("dir(class)","inspect class content");
    }
}
